package zx.lrn.notes.basic_grammer.internal_class;

/**
 * @ClassName: NormalInternalClass
 * @Description: 普通內部类学习
 * @Author: zhaoxuan
 * @Date: 2020/2/29 19:39
 **/
public class NormalInternalClass {

    private String outerFiled = "outer.outerFiled";

    private void outerSay() {
        System.out.println(this.new Inner().innerFiled);
    }

    /**
     * 普通内部类访问外部类属性的过程：
     * 编译器察觉到内部类对外围类私有属性的访问后，会在外部类中添加一个静态'getter"方法，该方法接受一个外围类类型的参数，
     * 当内部类需要获取外围类属性时，将外围类对象作为参数传递给上述静态getter方法，并返回作为参数传递的对象的那个私有属性的值。
     */
    public class Inner {
        private String innerFiled = "innerFiled";
        private String outerFiled = "inner.outerFiled";

        private void innerSay() {
            // 特殊语法一：内部类访问外围类的属性
            System.out.println(NormalInternalClass.this.outerFiled);
            System.out.println(outerFiled);
        }
    }

    public static void main(String[] args) {
        NormalInternalClass test = new NormalInternalClass();
        // 外围类可以访问到内部类的private属性
        test.outerSay();
        // 特殊语法二：内部类类型的表示和内部类对象创建
        NormalInternalClass.Inner inner = test.new Inner();
        // 内部类访问外围类属性和自身同名属性
        inner.innerSay();
    }
}
